//定义小仓库
import { defineStore } from 'pinia';
//token
import { getToken, removeToken, setToken } from '../utils/token-utils';
//引入ts类型
import type { UserInfoState } from './interface';
import {ElMessage} from 'element-plus'
//路由数组
import {staticRoutes, asyncRoutes, anyRoutes} from '@/router/routes'
import  type { RouteRecordRaw } from 'vue-router';
//引入路由
import router from '@/router'

//引入请求
import {reqLogin,reqUseInfo,reqLogOut} from '@/api/acl'


//筛选动态路由方法
/**
 * 
 * @param asyncRoutes 传入需要筛选的路由数组
 * @param routesName 后台返回的权限数组
 */
let filterAsyncRoutes = (asyncRoutes:RouteRecordRaw[],routesName:string[])=>{
  // 返回一个新数组
  let result = asyncRoutes.filter((item:RouteRecordRaw)=>{

    //存在后代路由  递归
    // 当前存在children属性,并且children为数组
    if(item.children && item.children.length){
      // 返回值由 item.children 接收,因为还是返回的路由数组
      item.children = filterAsyncRoutes(item.children,routesName)
    }

    // 查看该数组内是否有该路由名  设置权限
    return routesName.includes(item.name as string)
  })


  return result
}

//动态注册路由方法
let addRoutes = (routers:RouteRecordRaw[])=>{
  routers.forEach(item=>{
    // router.addRoute() 方法是由 vue-router提供的,用来动态注册路由的,直接拿过来用即可
    router.addRoute(item)
  })
}


/**
 * 用户信息
 * @methods setUserInfos 设置用户信息
 */
// 选择式API
export const useUserInfoStore = defineStore('userInfo', {

  //小仓库的数据
	state: (): UserInfoState => ({
    token: getToken() as string,  //token
    name: '', //名字
    avatar: '', //头像
    menuRoutes: [],  //路由数组
    buttons:[] ,  //按钮权限
  }),

  //小仓库方法
	actions: {
    // 登录发请求
    async login (username: string, password: string) {
    
      let result:any = await reqLogin({username,password})
      //本地持久化存储token
      setToken(result.token)
      //仓库存储token
      this.token = result.token
    },

    //守卫时调用,获取用户信息
    async getInfo () {
      let result:any = await reqUseInfo()
      //存储用户名
      this.name = result.name
      // 存储用户头像
      this.avatar = result.avatar
      //按钮权限
      this.buttons = result.buttons

      // 路由数组
      //调用请求筛选可用权限路由
      const filterRoutes = filterAsyncRoutes(asyncRoutes,result.routes)
      // 合并路由
      // 筛选过后的动态路由,静态路由,任意路由合并为一个数组
      const allRoutes = staticRoutes.concat(filterRoutes,anyRoutes)
      // 路由数组,静态页面左侧展示
      this.menuRoutes = allRoutes
      //动态注册路由
      addRoutes(allRoutes)
      
    },

    //退出登录
    async reset () {
      //发请求
      await reqLogOut()

      // 删除local中保存的token
      removeToken()
      // 提交重置用户信息的mutation
      this.token = ''
      this.name = ''
      this.avatar = ''
    },
	},
});
